﻿// ===============================================================================
//  Copyright © NewSQL.CN. All rights reserved .
//  技术论坛：http://newsql.cn/
//  个人博客：http://www.ymind.net/
//  版权所有：NewSQL中文社区 彦铭工作室
// ===============================================================================

using System;
using Newsql.Data.Configuration;

namespace Newsql.Data
{
	/// <summary>
	/// 为实体对象的数据访问层提供基类。
	/// </summary>
	public abstract class DatabaseDALBase
	{
		/// <summary>
		/// 初始化 <see cref="DatabaseDALBase"/> 对象。
		/// </summary>
		/// <param name="dbTypeId">数据库类型。</param>
		/// <param name="masterGroup">主机连接字符串的分组名称。</param>
		protected DatabaseDALBase(string dbTypeId, string masterGroup) : this(dbTypeId, masterGroup, masterGroup) { }

		/// <summary>
		/// 初始化 <see cref="DatabaseDALBase"/> 对象。
		/// </summary>
		/// <param name="dbTypeId">数据库类型。</param>
		/// <param name="masterGroup">主机连接字符串的分组名称。</param>
		/// <param name="slaveGroup">从机连接字符串的分组名称。</param>
		protected DatabaseDALBase(string dbTypeId, string masterGroup, string slaveGroup)
		{
			if (String.IsNullOrWhiteSpace(dbTypeId)) throw new ArgumentOutOfRangeException("dbTypeId");
			if (String.IsNullOrWhiteSpace(masterGroup)) throw new ArgumentOutOfRangeException("masterGroup");
			if (String.IsNullOrWhiteSpace(slaveGroup)) throw new ArgumentOutOfRangeException("slaveGroup");

			this.DbTypeId = dbTypeId;
			this.MasterConnectionStrings = DatabaseConfiguration.GetConnectionStrings(this.DbTypeId, masterGroup);
			this.SlaveConnectionStrings = DatabaseConfiguration.GetConnectionStrings(this.DbTypeId, slaveGroup);
		}

		/// <summary>
		/// 获取数据库类型标识符。
		/// </summary>
		protected string DbTypeId { get; set; }

		/// <summary>
		/// 获取默认数据库名称。
		/// </summary>
		protected abstract string DatabaseName { get; }

		/// <summary>
		/// 获取主机连接字符串。
		/// </summary>
		protected string MasterConnectionStrings { get; set; }

		/// <summary>
		/// 获取从机连接字符串。
		/// </summary>
		protected string SlaveConnectionStrings { get; set; }
	}
}
